package frame.laxcen.request;

import frame.laxcen.util.FrameWriter;
import util.ByteArrayUtil;
import util.ByteUtil;

// 读 6C 标签
public class Request_0010_10 implements IRequest {

    public final byte[] FrameBytes;

    // 默认为使用 1-4 号天线 单次读 TID定长 6个字(12字节)
    public Request_0010_10() {

        this.FrameBytes = FrameWriter.instance((byte) 0b0010, (byte) 0x10)
                                     .writeU8((byte) 0b1111)
                                     .writeU8((byte) 0b0000)
                                     .writeP16((byte) 0x02, (short) 0x0106)
                                     .toByteArray();

    }

    public Request_0010_10(RequestTemplate_0010_10 template) {

        FrameWriter w = FrameWriter.instance((byte) 0b0010, (byte) 0x10);

        w.writeU8(template.AntennaFlag);

        w.writeU8(template.ReadMode);

        if(template.hasParam_0x01()) {

            w.writeP8s((byte) 0x01, ByteArrayUtil.concat(new byte[] {

                    template.Pid_0x01_0, template.Pid_0x01_1, template.Pid_0x01_2, template.Pid_0x01_3

            }, template.Pid_0x01_4_to_n));
        }

        if(template.hasParam_0x02()) {

            w.writeP16((byte) 0x02, ByteUtil.bytePairToShort(template.Pid_0x02_0, template.Pid_0x02_1));
        }

        if(template.hasParam_0x03()) {

            w.writeP8((byte) 0x03, template.Pid_0x03_0);

            w.writeU8(template.Pid_0x03_1);

            w.writeU8(template.Pid_0x03_2);
        }

        if(template.hasParam_0x04()) {

            w.writeP8((byte) 0x04, template.Pid_0x04_0);

            w.writeU8(template.Pid_0x04_1);

            w.writeU8(template.Pid_0x04_2);
        }

        if(template.hasParam_0x05()) {

            w.writeP32((byte) 0x05, template.Pid_0x05_0);

            w.writeU32(template.Pid_0x05_1);

            w.writeU32(template.Pid_0x05_2);

            w.writeU32(template.Pid_0x05_3);
        }

        this.FrameBytes = w.toByteArray();
    }

    @Override
    public byte[] getFrameBytes() {

        return FrameBytes;
    }

    public static class RequestTemplate_0010_10 {

        // 天线端口

        // bit位 0 - 4 对应 天线 1 - 4
        // 置 1 时为使用该天线

        public byte AntennaFlag = (byte) 0b1111;

        // 读取模式

        // 0 -> 单次读
        // 1 -> 连续读

        public byte ReadMode = (byte) 0b0;

        // 读取的标签内容需要匹配的参数

        // 0 -> 匹配的数据区 1.EPC 2.TID 3. 用户数据区
        // 1 -> 地址 高8位
        // 2 -> 地址 低8位
        // 3 -> 需要匹配的数据的位长度 即bit长度 Byte是8位的
        // 4 to n -> 需要匹配的数据内容

        public Byte Pid_0x01_0;

        public Byte Pid_0x01_1;

        public Byte Pid_0x01_2;

        public Byte Pid_0x01_3;

        public byte[] Pid_0x01_4_to_n;

        // TID 读取参数

        // 0 -> 读取模式 0.自适应 1.定长
        // 1 -> 读取的字长 字 = 2字节 = 16bit

        public Byte Pid_0x02_0;

        public Byte Pid_0x02_1;

        // 用户数据区读取参数

        // 0 -> 地址 高8位
        // 1 -> 地址 低8位
        // 2 -> 读取字长 字 = 2字节 = 16bit

        public Byte Pid_0x03_0;

        public Byte Pid_0x03_1;

        public Byte Pid_0x03_2;

        // 保留区读取参数

        // 0 -> 地址 高8位
        // 1 -> 地址 低8位
        // 2 -> 读取字长 字 = 2字节 = 16bit

        public Byte Pid_0x04_0;

        public Byte Pid_0x04_1;

        public Byte Pid_0x04_2;

        // 标签访问密码

        // 四位 U32

        public Integer Pid_0x05_0;

        public Integer Pid_0x05_1;

        public Integer Pid_0x05_2;

        public Integer Pid_0x05_3;

        public boolean hasParam_0x01() {

            if(Pid_0x01_0 == null) return false;

            if(Pid_0x01_1 == null) return false;

            if(Pid_0x01_2 == null) return false;

            if(Pid_0x01_3 == null) return false;

            if(Pid_0x01_4_to_n == null) return false;

            return true;
        }

        public boolean hasParam_0x02() {

            if(Pid_0x02_0 == null) return false;

            if(Pid_0x02_1 == null) return false;

            return true;
        }

        public boolean hasParam_0x03() {

            if(Pid_0x03_0 == null) return false;

            if(Pid_0x03_1 == null) return false;

            if(Pid_0x03_2 == null) return false;

            return true;
        }

        public boolean hasParam_0x04() {

            if(Pid_0x04_0 == null) return false;

            if(Pid_0x04_1 == null) return false;

            if(Pid_0x04_2 == null) return false;

            return true;
        }

        public boolean hasParam_0x05() {

            if(Pid_0x05_0 == null) return false;

            if(Pid_0x05_1 == null) return false;

            if(Pid_0x05_2 == null) return false;

            if(Pid_0x05_3 == null) return false;

            return true;
        }
    }
}
